Skip to content

Use EventPriority to track update priority - #21082

Merged
acdlite merged 1 commit into
react:masterfrom
acdlite:event-priority-for-updates
Mar 25, 2021
Merged

Use EventPriority to track update priority#21082
acdlite merged 1 commit into
react:masterfrom
acdlite:event-priority-for-updates

Conversation

@acdlite

@acdlite acdlite commented Mar 24, 2021

Copy link
Copy Markdown
Collaborator

Instead of LanePriority. Internally, EventPriority is just a lane, so this skips an extra conversion. Since EventPriority is a "public" (to the host config) type, I was also able to remove some deep imports of the Lane module.

This gets us most of the way to deleting the LanePriority entirely.

@facebook-github-bot facebook-github-bot added React Core Team Opened by a member of the React Core Team CLA Signed labels Mar 24, 2021

let currentUpdatePriority: EventPriority = NoLane;

export function getCurrentUpdatePriority(): EventPriority {

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Re: naming, I was thinking I would rename this to getCurrentEventPriority, and then rename the host config one to something like getCurrentHostEventPriority. Gonna leave as-is in this PR, though.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why bother to rename more than this if we're going to remove it?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is staying. It tracks a Lane now instead of a LanePriority.

@acdlite
acdlite requested a review from rickhanlonii March 24, 2021 23:54
@acdlite
acdlite marked this pull request as ready for review March 24, 2021 23:54
@sizebot

sizebot commented Mar 24, 2021

Copy link
Copy Markdown

Comparing: 148f8e4...4b7ff7f

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.min.js = 122.62 kB 122.51 kB = 39.45 kB 39.45 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js = 129.02 kB 128.94 kB +0.11% 41.43 kB 41.48 kB
facebook-www/ReactDOM-prod.classic.js = 407.89 kB 406.90 kB = 75.53 kB 75.49 kB
facebook-www/ReactDOM-prod.modern.js = 396.14 kB 395.16 kB = 73.62 kB 73.57 kB
facebook-www/ReactDOMForked-prod.classic.js = 407.89 kB 406.90 kB = 75.53 kB 75.49 kB
oss-experimental/react-reconciler/cjs/react-reconciler-constants.development.js +11.67% 1.71 kB 1.90 kB +2.35% 0.81 kB 0.83 kB
oss-stable/react-reconciler/cjs/react-reconciler-constants.development.js +11.67% 1.71 kB 1.90 kB +2.35% 0.81 kB 0.83 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-reconciler/cjs/react-reconciler-constants.development.js +11.67% 1.71 kB 1.90 kB +2.35% 0.81 kB 0.83 kB
oss-stable/react-reconciler/cjs/react-reconciler-constants.development.js +11.67% 1.71 kB 1.90 kB +2.35% 0.81 kB 0.83 kB
facebook-www/ReactDOMTesting-prod.classic.js = 399.78 kB 398.95 kB = 75.50 kB 75.45 kB
facebook-www/ReactDOMTesting-prod.modern.js = 385.99 kB 385.16 kB = 73.20 kB 73.16 kB
react-native/implementations/ReactFabric-profiling.js = 285.51 kB 284.89 kB = 51.06 kB 50.97 kB
react-native/implementations/ReactFabric-profiling.fb.js = 285.46 kB 284.84 kB = 51.03 kB 50.95 kB
facebook-www/ReactDOM-prod.classic.js = 407.89 kB 406.90 kB = 75.53 kB 75.49 kB
facebook-www/ReactDOMForked-prod.classic.js = 407.89 kB 406.90 kB = 75.53 kB 75.49 kB
facebook-www/ReactDOM-prod.modern.js = 396.14 kB 395.16 kB = 73.62 kB 73.57 kB
facebook-www/ReactDOMForked-prod.modern.js = 396.15 kB 395.16 kB = 73.63 kB 73.58 kB
react-native/implementations/ReactNativeRenderer-profiling.js = 292.84 kB 292.10 kB +0.03% 52.43 kB 52.44 kB
react-native/implementations/ReactNativeRenderer-profiling.fb.js = 292.78 kB 292.03 kB +0.03% 52.40 kB 52.41 kB
react-native/implementations/ReactFabric-prod.js = 272.86 kB 272.16 kB = 48.70 kB 48.62 kB
react-native/implementations/ReactFabric-prod.fb.js = 272.81 kB 272.11 kB = 48.68 kB 48.59 kB
react-native/implementations/ReactNativeRenderer-prod.js = 280.21 kB 279.39 kB = 50.06 kB 50.04 kB
react-native/implementations/ReactNativeRenderer-prod.fb.js = 280.16 kB 279.33 kB = 50.03 kB 50.01 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js = 252.70 kB 251.93 kB +0.02% 46.23 kB 46.24 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js = 240.19 kB 239.34 kB = 43.95 kB 43.92 kB
facebook-www/ReactART-prod.classic.js = 263.43 kB 262.46 kB = 46.69 kB 46.63 kB
facebook-www/ReactART-prod.modern.js = 256.07 kB 255.09 kB = 45.45 kB 45.41 kB

Generated by 🚫 dangerJS against 4b7ff7f

@acdlite
acdlite force-pushed the event-priority-for-updates branch from 35f87aa to 64284ec Compare March 25, 2021 04:03
Instead of LanePriority. Internally, EventPriority is just a lane, so
this skips an extra conversion. Since EventPriority is a "public" (to
the host config) type, I was also able to remove some deep imports
of the Lane module.

This gets us most of the way to deleting the LanePriority entirely.
@acdlite
acdlite force-pushed the event-priority-for-updates branch from 64284ec to 4b7ff7f Compare March 25, 2021 05:38
@acdlite acdlite mentioned this pull request Mar 25, 2021
6 tasks
// Copied from ReactFiberLanes. Don't do this!
// This is hard coded directly to avoid needing to import, and
// we'll remove this as we replace runWithPriority with React APIs.
export const IdleLanePriority = 2;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💖

blockedOn: null,
target: target,
lanePriority: updateLanePriority,
priority: updatePriority,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It comes full circle - this was the original name of the field when it was the scheduler priority, which we had to keep alongside lanePriority.

};
let i = 0;
for (; i < queuedExplicitHydrationTargets.length; i++) {
// Stop once we hit the first target with lower priority than

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Lower than what?

!isHigherEventPriority(
updatePriority,
queuedExplicitHydrationTargets[i].priority,
)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice catch

? (IdleEventPriority_new: any)
: (IdleEventPriority_old: any);

export function runWithPriority<T>(priority: EventPriority, fn: () => T): T {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this is only for tests now - how long until we can remove this? We'll need Offscreen for the low priority, but can we replace the Continuous with something that's actually continuous instead?


let currentUpdatePriority: EventPriority = NoLane;

export function getCurrentUpdatePriority(): EventPriority {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why bother to rename more than this if we're going to remove it?

finishedRoot: FiberRoot,
current: Fiber,
nearestMountedAncestor: Fiber,
renderPriorityLevel: LanePriority,

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice find, I noticed this was unused too.

const schedulerPriority =
priorityLevel === NoLanePriority
? NormalPriority
: lanePriorityToSchedulerPriority(priorityLevel);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why inline? Do you anticipate this is the only place you'll need to do this conversion?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Currently it is, yeah. Also there's a backlog item to discuss what kind of priority to expose and how. Scheduler priority doesn't really make sense anymore because of our decoupling work.

So inlining makes it harder for it to leak to more places.


export const DiscreteEventPriority: EventPriority = enableNewReconciler
? (DiscreteEventPriority_new: any)
: (DiscreteEventPriority_old: any);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why any type them?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The host config isn't forked, but it handles types from both reconciler forks. Like Fiber is technically a cross-fork type, because it gets passed between the host config and reconciler. That's why we have the ReactInternalTypes module.

Other than forking all the renderers, there's no way (at least that I've that I've found) to express that the type passed is the correct one for the given fork. So we cheat.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants